package com.yj.springbootstudy.mulThread.imooc;

import sun.reflect.generics.tree.VoidDescriptor;

import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 案列：
 *
 * 创建一个工厂类 TicketCenter，该类包含两个方法，saleRollback 退票方法和 sale 售票方法；
 * 定义一个车票总数等于 10 ，为了方便观察结果，设置为 10。学习者也可自行选择数量；
 * 对于 saleRollback 方法，当发生退票时，通知售票窗口继续售卖车票；
 * 对 saleRollback 进行特别设置，每隔 5000 毫秒退回一张车票；
 * 对于 sale 方法，只要有车票就进行售卖。为了更便于观察结果，每卖出一张车票，sleep 2000 毫秒；
 * 创建一个测试类，main 函数中创建 2 个售票窗口和 1 个退票窗口，运行程序进行结果观察。
 * 修改 saleRollback 退票时间，每隔 25 秒退回一张车票；
 * 再次运行程序并观察结果。
 *
 */
public class Demo07 {
}

class TicketCenter{
    private LinkedList<String> linkedList = new LinkedList<>();
    private int capacity = 10;
    private Lock lock = new ReentrantLock();
    private Condition saleCondition = lock.newCondition();

    public void sale(){
        try {
            lock.lock();
            while (linkedList.size() == 0){
                saleCondition.await();
            }

            capacity--;
            System.out.println("售票号:"+capacity);
            Thread.sleep(2000);

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

    public void saleRollBack(){
        try {
            lock.lock();
            Thread.sleep(5000);
            System.out.println("线程："+Thread.currentThread().getName()+"发生了退票！");
            capacity++;
            saleCondition.signalAll();

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

}
